银行家算法避免死锁

要求:

  1. 完成程序数据结构的设计,数据的录入。
  2. 完成进程需求矩阵的输出,包括最大需求矩阵,尚需资源矩阵,可获得资源显示。
  3. 完成某进程请求资源试分配。
  4. 完成安全性检查。

 

#include<iostream.h>

#include<string.h>

#include<stdlib.h>

#include<stdio.h>

#define Status int

#define true 1

#define false 0

int M=100;//进程的最大数为100

int N=100;//资源的最大数为100

int Claim[100][100]={0};//各进程所需各类资源的最大需求

int Available[100]={0};//系统可用资源

char name[100]={0};//资源的名称

int Allocation[100][100]={0};//系统已分配资源

int Need[100][100]={0};//还需要资源

int Request[100][100]={0};//请求资源向量

int finish[100]={0};//存放安全序列

int Work[100]={0};//存放系统可提供资源

 

  1. 1.         试探分配

当进程pi提出资源申请时,系统执行下列步骤:

(1)若Request[i][j]≤Need[i][j],转(2);

     否则错误返回

(2)若Request[i][j]≤Available[j],

     转(3);否则进程等待

(3)试探着把资源分配给进程Pi,则有:

     Available[j]=Available[j]-Request[i][j]; 

Allocation[i],[j]=Allocation[i],[j]+Request[i][j]; 

     Need[i],[j]=Need[i],[j]-Request[i][j];

 

  1. 2.         安全性检测算法:

n  借助于死锁的安全性测试算法来实现。

n  定义布尔型向量finish[k],k=1,..,n。检测死锁算法如下:

(1)Work= Available

(2)在剩余的进程集合中查每一个进程Pk,如果Claim[k,*]- Allocation [k,*]=0,则finish[k]:=true;否则finish[k]:=false;这里k=1,..,n

(3)在剩余的进程集合中找一个进程Pk,需满足条件:

finish[k]=false&(request[*]≤Work)

找到这样的Pk便转(4);否则转(5)

(4)Work:= Work + Allocation;finish[k]:=true;然后转(3)

(5) 如果对k=1,..,n若finish[k]=true不成立,那么,系统出现了死锁,并且finish[k]=false的Pk为死锁进程。

 

 

 1 #include<iostream.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 #include<stdio.h>
 5 #define Status int
 6 #define true 1
 7 #define false 0
 8 int M=100;//进程的最大数为100
 9 int N=100;//资源的最大数为100
10 int Claim[100][100]={0};//各进程所需各类资源的最大需求
11 int Available[100]={0};//系统可用资源
12 char name[100]={0};//资源的名称
13 int Allocation[100][100]={0};//系统已分配资源
14 int Need[100][100]={0};//还需要资源
15 int Request[100][100]={0};//请求资源向量
16 int finish[100]={0};//存放安全序列
17 int Work[100]={0};//存放系统可提供资源
18 void write();
19 
20 main()
21 {
22     write();
23 }
24 
25 void write()
26 {
27     char s;
28     int i,j;
29     FILE* fp=fopen("C:\\io.txt","w");
30     
31     printf("请输入进程数:\n");
32     scanf("%d",&M);
33     fprintf(fp,"\n%d",M);
34 
35     printf("请输入资源数:\n");
36     scanf("%d",&N);
37     fprintf(fp,"\n%d",N);
38 
39 
40     for(i=0;i<M;i++)
41     {
42         for(j=0;j<N;j++)
43         {
44 
45             printf("请输入%d进程所需%d资源的最大需求:\n",i+1,j+1);
46             scanf("%d",&Claim[j][i]);
47             fprintf(fp,"\n%d",Claim[j][i]);
48         }
49     }
50 
51     for(i=0;i<N;i++)
52     {
53         printf("请输入%d资源的最大需求:\n",i+1);
54         scanf("%d",&Available[i]);
55         fprintf(fp,"\n%d",Available[i]);
56     }
57 
58     
59     fclose(fp);
60 }

 

posted @ 2016-05-20 15:54  Wicker  阅读(606)  评论(0编辑  收藏  举报